#ifndef LANSERVICE_H
#define LANSERVICE_H

#include <QObject>
#include <QUdpSocket>
#include <QTimer>
#include <QHostInfo>
#include <QNetworkInterface>
#include <QJsonObject>
#include <QJsonDocument>
#include <QHostAddress>

#include "../logging/logger.h"

// 默认发现服务端口
#define LAN_DISCOVERY_PORT 5901

// 发现服务类型
enum class DiscoveryType {
    Broadcast, // 广播发现请求
    Response,  // 响应发现请求
    Heartbeat  // 心跳包
};

// LAN服务类，用于局域网发现和主机管理
class LANService : public QObject
{
    Q_OBJECT
    
public:
    static LANService* getInstance();
    
    // 开始服务端广播（用于服务端宣告自己的存在）
    bool startServerBroadcast(quint16 servicePort, const QString &serverName = "");
    
    // 停止服务端广播
    void stopServerBroadcast();
    
    // 开始客户端发现（用于客户端发现局域网内的服务器）
    bool startClientDiscovery();
    
    // 停止客户端发现
    void stopClientDiscovery();
    
    // 获取当前发现的服务器列表
    QList<QPair<QString, quint16>> getDiscoveredServers() const;
    
    // 获取本机IP地址列表
    static QStringList getLocalIPAddresses();
    
signals:
    // 发现了新服务器
    void serverDiscovered(const QString &serverAddress, quint16 serverPort, const QString &serverName);
    
    // 服务器不再可用
    void serverLost(const QString &serverAddress, quint16 serverPort);
    
private slots:
    // 处理UDP数据接收
    void processDatagrams();
    
    // 广播服务端存在
    void broadcastServerPresence();
    
    // 广播发现请求
    void broadcastDiscoveryRequest();
    
    // 检查服务器超时
    void checkServerTimeout();
    
private:
    explicit LANService(QObject *parent = nullptr);
    ~LANService();
    
    static LANService *instance;
    
    QUdpSocket *socket;
    QTimer *broadcastTimer;
    QTimer *discoveryTimer;
    QTimer *checkAliveTimer;
    
    quint16 servicePort;            // 服务的实际端口（与发现端口可能不同）
    QString serverName;             // 服务器名称
    bool isServer;                  // 是否是服务器模式
    
    // 已发现的服务器信息：IP地址，端口，上次发现时间，服务器名称
    QMap<QString, QPair<QPair<quint16, QDateTime>, QString>> discoveredServers;
    
    // 发送发现消息
    void sendDiscoveryMessage(DiscoveryType type);
    
    // 处理发现请求
    void handleDiscoveryRequest(const QHostAddress &sender, quint16 senderPort);
    
    // 处理响应消息
    void handleResponseMessage(const QHostAddress &sender, const QJsonObject &data);
};

#endif // LANSERVICE_H 